在官方文件關於FOR XML PATH的說明是:可以 XML 格式擷取 SQL 查詢的正式結果。
不論是以上的說明,或是文件列舉的資料,其實我不太清楚這個功能要如何使用,
直到實務上遇到需要從DB產出資料的需求後,才對FOR XML PATH有初步的了解。
原始報表資料如下:
可以看到有多筆關於user的欄位值都是重複的,
但因為ProjectName欄位值不同的緣故,
資料被分割成多筆,這在資料管理上是沒有問題的,
但如果需要將資料以報表等方式呈現時,會偏好讓ProjectName合併在一起,
一名人員只需要顯示一筆資料即可,這時候FOR XML PATH就派上用場了~
首先,使用for XML Path('')
針對ProjectName去做合併,
每一筆ProjectName的資料用逗號分隔:
SELECT T1.UnitName, T1.Account, T1.UserName,
(
SELECT ',' + T2.ProjectName
FROM Users T2
WHERE T1.UnitName = T2.UnitName and T1.Account = T2.Account and T1.UserName = T2.UserName
for XML Path('')
) AS ProjectName
FROM Users T1
可以看到ProjectName被合併了,但有資料重複,
以及ProjectName最前方多出一個逗號的問題:
使用DISTINCT
移除重複資料,並用STUFF
把ProjectName最前方的逗號移除:
SELECT DISTINCT T1.UnitName, T1.Account, T1.UserName,
STUFF((
SELECT ',' + T2.ProjectName
FROM Users T2
WHERE T1.UnitName = T2.UnitName and T1.Account = T2.Account and T1.UserName = T2.UserName
for XML Path('')
), 1, 1, '') AS ProjectName
FROM Users T1
最終資料如下: